package controller;

import dao.CorrecaoListaAlunoJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import model.Aluno;
import model.CorrecaoListaAluno;
import model.Lista;
import model.ListaAluno;
import model.Questao;
import model.QuestaoLista;
import pagecontroller.JsfUtil;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 */
public class CorrecaoListaAlunoController extends Controller {

    public CorrecaoListaAlunoController() {
        if (JsfUtil.getObjectFromSession("CorrecaoListaAlunoJpaController") == null) {
            jpaController = new CorrecaoListaAlunoJpaController();
        } else {
            jpaController = (CorrecaoListaAlunoJpaController) JsfUtil.getObjectFromSession("CorrecaoListaAlunoJpaController");
        }
    }
    private CorrecaoListaAluno correcaoListaAluno = null;
    private CorrecaoListaAluno correcaoListaAlunoAux = null;
    private CorrecaoListaAlunoJpaController jpaController = null;
    private List<CorrecaoListaAluno> correcaoListaAlunos = null;
    private List<ListaAluno> listaAlunos;
    private List<QuestaoLista> questaoListas;
    private Lista lista;
    private List<CorrecaoListaAluno> correcaoLista;
    
    private int erros, atualizacos, cadastros;

    public void clear() {
        lista = null;
        listaAlunos = null;
        correcaoLista = null;
        correcaoListaAluno = null;
        correcaoListaAlunos = null;
        cadastros = 0;
        erros = 0;
        atualizacos = 0;
        questaoListas= null;
    }

    public String setPageCorrecaoListaAlunoCad() {
        clear();
        getPageManager().setTemplate1();
        return getPageManager().setPageCorrecaoListaAlunoCad();
    }

    public String persiste() {
        for (CorrecaoListaAluno cla : getCorrecaoLista()) {
            correcaoListaAluno = cla;
            if (cla.getId() == null) {
                create();
            } else {
                update();
            }
        }
        
        if (atualizacos > 0) {
            JsfUtil.addSuccessMessage(atualizacos + " Nota(s) Atualizada(s) com Sucesso");
        }
        if (cadastros > 0) {
            JsfUtil.addSuccessMessage(cadastros + " Nota(s) cadastrada(s) com sucesso.");
        }
        if (erros > 0) {
            JsfUtil.addErrorMessage(erros + " Erros Durante a Persistência das Notas.");
        }
        getListaAlunoController().setLista(lista);
        clear();
        
        if(erros>0){
            return "refreshPage";
        }
        return getPageManager().setPageListaAlunoList();
        

    }

    public String update() {
        try {
            jpaController.edit(this.correcaoListaAluno);
            correcaoListaAlunoAux = correcaoListaAluno;
            this.correcaoListaAluno = null;
            atualizacos++;

        } catch (Exception ex) {
            erros++;
        }
        return "refreshPage";
    }

    public String create() {
        try {
            jpaController.create(correcaoListaAluno);
            correcaoListaAlunoAux = correcaoListaAluno;
            correcaoListaAluno = null;
            cadastros++;
        } catch (Exception e) {
            erros++;
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        CorrecaoListaAluno correcaoListaAlunoTemp = (CorrecaoListaAluno) JsfUtil.getObjectFromRequestParameter("correcaoListaAluno");
        this.correcaoListaAluno = correcaoListaAlunoTemp;
        return "refreshPage";
    }

    public String destroy() {
        CorrecaoListaAluno correcaoListaAlunoTemp = (CorrecaoListaAluno) JsfUtil.getObjectFromRequestParameter("correcaoListaAluno");
        try {
            jpaController.destroy(correcaoListaAlunoTemp.getId());
            JsfUtil.addSuccessMessage("CorrecaoListaAluno removido com sucesso.");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(CorrecaoListaAlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public CorrecaoListaAluno getCorrecaoListaAluno() {
        if (correcaoListaAluno == null) {
            correcaoListaAluno = new CorrecaoListaAluno();
        }
        return correcaoListaAluno;
    }

    public List<CorrecaoListaAluno> getCorrecaoListaAlunos() {
        this.correcaoListaAlunos = jpaController.findCorrecaoListaAlunoEntities();
        return this.correcaoListaAlunos;
    }

    public CorrecaoListaAlunoJpaController getJpaController() {
        return jpaController;
    }

    public CorrecaoListaAluno getCorrecaoListaAlunoAux() {
        return correcaoListaAlunoAux;
    }

    public Lista getLista() {
        if (lista == null) {
            lista = getRenewListaController().getListaAux();
            if (lista == null) {
                lista = new Lista();
            }
        }
        return lista;
    }

    public void setLista(Lista lista) {
        this.lista = lista;
    }

    public List<ListaAluno> getListaAlunos() {

        if (listaAlunos == null) {
            listaAlunos = getRenewListaAlunoController().getListaAlunosLista2(getLista());
            if (listaAlunos == null) {
                listaAlunos = new ArrayList<ListaAluno>();
            }
        }

        return listaAlunos;
    }

    public void setListaAlunos(List<ListaAluno> listaAlunos) {
        this.listaAlunos = listaAlunos;
    }

    public List<QuestaoLista> getQuestaoListas() {
        if (questaoListas == null) {
            questaoListas = getRenewQuestaoListaController().getQuestaoListas(getLista());
            if (questaoListas == null) {
                questaoListas = new ArrayList<QuestaoLista>();
            }
        }
        return questaoListas;
    }

    public void setQuestaoListas(List<QuestaoLista> questaoListas) {
        this.questaoListas = questaoListas;
    }

    public Integer getNumeroQuestoes() {
        return getQuestoes().size();
    }

    public List<CorrecaoListaAluno> getCorrecaoLista() {
        if (correcaoLista == null) {
            correcaoLista = new ArrayList<CorrecaoListaAluno>();

            //percorre os alunos da lista

            for (ListaAluno la : getListaAlunos()) {

                //percorre as questoes da lista
                for (QuestaoLista ql : getQuestaoListas()) {
                    //verifica se ja esta no banco                    
                    List<CorrecaoListaAluno> clas = jpaController.findCorrecaoListaAluno(la, ql);
                    if (clas != null && clas.size() > 0) {
                        correcaoLista.add(clas.get(0));
                    } //se nao esta adiciona na lista
                    else {
                        CorrecaoListaAluno cla = new CorrecaoListaAluno();
                        cla.setListaAluno(la);
                        cla.setQuestaoLista(ql);
                        cla.setNota(0);
                        correcaoLista.add(cla);
                    }
                }
            }
        }

        return correcaoLista;
    }

    
    public List<CorrecaoListaAluno> getCorrecaoListaAlunos(ListaAluno listaAluno){
        
        return jpaController.findCorrecaoListaAluno(listaAluno);
    }
    
    public void setCorrecaoLista(List<CorrecaoListaAluno> correcaoLista) {
        this.correcaoLista = correcaoLista;
    }

    public List<Questao> getQuestoes() {
        List<Questao> qs = new ArrayList<Questao>();
        for (QuestaoLista ql : getQuestaoListas()) {
            qs.add(ql.getQuestaoProfessor().getQuestao());
        }

        return qs;
    }

    public List<Aluno> getAlunos() {
        List<Aluno> as = new ArrayList<Aluno>();
        for (ListaAluno la : getListaAlunos()) {
            as.add(la.getAluno());
        }
        return as;
    }

}
